package com.learning.demos;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author adolphw
 *
 * cas是什么  ===》compareAndSet
 * 比较并交换
 *
 * cpu并发原语
 * 执行连续并不允许被中断
 *
 *
 */
public class CASDemo {

    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);

        // unsafe
        // 是cas的核心类，由于java方法无法直接访问底层系统，需要通过本地（native）方法来访问，unsafe相当于一个后门，基于该类可直接操作特定内存
        // 数据，unsafe类存在于sun.misc包中，其内部方法操作可以像c的指针一样直接操作内存，因为java中cas的操作依赖于unsafe类的方法。
        // unsafe类中所有方法都是native修饰的，也就是说unsafe类中的方法都是直接调用操作系统的底层资源执行相应任务
        System.out.println(atomicInteger.compareAndSet(5, 2021) + "\t current data: " + atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5, 1024) + "\t current data: " + atomicInteger.get());

        // 自旋锁思想 do while
        atomicInteger.getAndIncrement();

        // 缺点，需要多次比较，循环时间长，增大cpu开销；只能保证一个共享变量的原子操作；引发ABA问题

        // synchonic 加锁 做一个少一个，多方法对象

        // ABA 狸猫换太子 偷梁换柱 ab 线程处理速度不同，a慢b快，b改了两次  a改一次， 只管开始和结束结果



    }
}
